import requests
from bs4 import BeautifulSoup
import re
import time

class AuthLogin:
    def __init__(self, login_url):
        self.login_url = login_url
        self.session = requests.Session()
        # 添加请求头，模拟浏览器访问
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        })

    def get_login_page(self,url,login_data):
        try:
            # 发送POST请求进行登录
            print("发送登录请求...")
            response = self.session.post(url, data=login_data)

            if response.status_code != 200:
                print(f"登录失败，状态码: {response.status_code}")
                return None
            print(f"登录成功，状态码: {response.status_code}")

            print("登录后会话cookies:")
            for cookie in self.session.cookies:
                print(f"  {cookie.name}: {cookie.value}")
            
            # 显示所有cookies键值对，其中可能包含token
            print("登录后会话中的关键信息:")
            for key, value in self.session.cookies.get_dict().items():
                # 通常token相关的键名可能包含以下关键词
                if any(token_word in key.lower() for token_word in ['token', 'auth', 'session', 'csrf', 'lt']):
                    print(f"  可能的Token信息 - {key}: {value}")
            return response

        except requests.exceptions.RequestException as e:
            print(f"登录失败: {e}")
            return None

    def login(self, username, password):
        """
        执行登录操作并返回登录后的会话
        """
        print(f"准备登录用户: {username}")
        
        # 获取登录页面和隐藏字段
        hidden_fields, page_content = self.get_login_page()
        
        # 检查是否需要验证码
        if self.check_captcha(page_content):
            print("系统要求输入验证码，请手动处理")
            # 这里可以添加验证码处理逻辑
        
        # 构造登录数据
        login_data = {
            'username': username,
            'password': password,
            **hidden_fields  # 合并隐藏字段
        }
        
        # 显示将要提交的数据（隐藏密码）
        print("登录数据准备完成:")
        for key, value in login_data.items():
            if key == 'password':
                print(f"  {key}: {'*' * len(value)}")
            else:
                print(f"  {key}: {value}")
        
        # 尝试登录
        try:
            print("正在提交登录请求...")
            response = self.session.get(self.login_url, data=login_data, timeout=10, allow_redirects=True)
            response.encoding = response.apparent_encoding
            
            # 保存响应内容到文件以便分析
            with open('login_response.html', 'w', encoding='utf-8') as f:
                f.write(response.text)
            print("登录响应已保存到 login_response.html")
            
            # 检查是否登录成功
            if self.check_login_success(response.text):
                print("登录成功!")
                return self.session  # 返回会话对象以便后续操作
            else:
                print("登录失败，请检查用户名和密码")
                return self.session  # 即使失败也返回会话对象，便于后续处理
        except Exception as e:
            print(f"登录请求失败: {e}")
            return self.session  # 出错时也返回会话对象，便于后续调试
    
    def check_login_success(self, content):
        """
        检查是否登录成功
        """
        # 这里需要根据实际登录成功后的页面特征来判断
        # 可能包括跳转到其他页面、出现特定标识等
        success_indicators = ['退出', '注销', 'welcome', 'index', '主页', 'dashboard']
        
        # 检查是否仍然在登录页面（登录失败的情况）
        if "登录" in content and ("用户名" in content or "password" in content.lower()):
            return False
            
        for indicator in success_indicators:
            if indicator in content:
                return True
                
        # 检查是否重定向到了预约页面或其他非登录页面
        if "预约" in content or "booking" in content.lower():
            return True
            
        return False
    
    def get_session(self):
        """
        获取登录后的会话对象，用于后续操作
        """
        if self.session:
            print("当前会话有效")
            return self.session
        else:
            print("未创建会话，请先登录")
            return None

if __name__ == "__main__":
    # 登录URL
    LOGIN_URL = "https://authserver.swun.edu.cn/authserver/login"
    
    # 创建登录对象
    auth = AuthLogin(LOGIN_URL)
    
    # 获取用户输入
    username = input("请输入用户名: ")
    password = input("请输入密码: ")
    
    # 执行登录
    session = auth.login(username, password)
    if session:
        print("登录成功，可以进行后续操作了")
        # 这里可以继续进行其他操作
    else:
        print("登录失败")